#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
using P = pair<int, int>;
int N, R; // R条道路, N个路口

struct edge {int to, cost;};
constexpr int MAXV = 10, INF = 1 << 29;
bool used[MAXV];
int d[MAXV], d2[MAXV];
vector<edge> G[MAXV];

int solve();

int main() {

}

int solve() {
    // 一个次长的边, 由1到u, 由什么组成呢 ?
    // 1. 由1到v的最短边 + cost[v][u] 2. 由1到v的次短边 + cost[v][u]
    fill(d, d + N + 1, INF);
    fill(d2, d2 + N + 1, INF);
    priority_queue<P, vector<P>, greater<P>> q;
    q.push(P(0, 1)); // first -> distance, second -> point
    d[1] = 0; d2[1] = 0;

    while (!q.empty()) {
        P p = q.top(); q.pop(); // 挑选顶部
        int distance = p.second, point = p.first;
        if (distance > d2[point]) continue; // 如果比次短距离还要长, 就进行跳过
        for (int i = 0; i < G[point].size(); i++) { // 更新所有的可达点
            edge e = G[point][i];
            int distance2 = distance + e.cost;
            if (d[e.to] > distance2) {
                swap(d[e.to], distance2); // 这个稍微大的就变成了次短
                q.push(P(d[e.to], e.to));
            }
            if (d2[e.to] > distance2 && d[e.to] < distance2) {
                d2[e.to] = distance2;
                q.push(P(d2[e.to], e.to));
            }
        }
    }
    return d2[R]; // 
}